package ar.edu.unrn.lia.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.inject.Named;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import ar.edu.unrn.lia.dao.CuentaDAO;
import ar.edu.unrn.lia.generic.GenericDaoJpaImpl;
import ar.edu.unrn.lia.model.Cuenta;
import ar.edu.unrn.lia.model.Cuenta.Estado;
import ar.edu.unrn.lia.model.Cuenta.Grupo;
import ar.edu.unrn.lia.model.Cuenta.SubGrupo;

@Named("cuentaDAO")
public class CuentaDAOImpl extends GenericDaoJpaImpl<Cuenta, Long> implements
		CuentaDAO, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2265039351337612438L;

	public Predicate[] getSearchPredicates(Root<Cuenta> root,
			Map<String, String> filters) {

		CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
		List<Predicate> predicatesList = new ArrayList<Predicate>();
		root.alias("entity");

		filtroLike("nombre", predicatesList, builder, root, filters);
		filtroLike("codigo", predicatesList, builder, root, filters);
		filtroLike("tipo", predicatesList, builder, root, filters);
		filtroEqual("numero", predicatesList, builder, root, filters);

		String grupo = filters.get("grupo");
		if (grupo != null && !"".equals(grupo)) {
			for (Grupo av : Grupo.values()) {
				if (av.toString().equals(grupo)) {
					predicatesList.add(builder.equal(root.get("grupo"), av));
				}
			}
		}

		String subGrupo = filters.get("subGrupo");
		if (subGrupo != null && !"".equals(subGrupo)) {
			for (SubGrupo av : SubGrupo.values()) {
				if (av.toString().equals(subGrupo)) {
					predicatesList.add(builder.equal(root.get("subGrupo"), av));
				}
			}
		}

		String cuentaEstado = filters.get("estado");
		if (cuentaEstado != null && !"".equals(cuentaEstado)) {
			for (Estado av : Estado.values()) {
				if (av.toString().equals(cuentaEstado)) {
					predicatesList.add(builder.equal(root.get("estado"), av));
				}
			}
		}

		return predicatesList.toArray(new Predicate[predicatesList.size()]);
	}

	public Integer buscarUltimoCodDeCuenta(Grupo grupo, SubGrupo subgrupo) {
		// log.debug("buscarUltimoCodDeCuenta Cuenta with codigo: " + grupo);
		try {
			CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
			CriteriaQuery<Integer> criteria = builder
					.createQuery(Integer.class);
			Root<Cuenta> cuentaRoot = criteria.from(Cuenta.class);
			criteria.select(builder.max(cuentaRoot.<Integer> get("numero")));
			criteria.where(builder.equal(cuentaRoot.get("grupo"), grupo),
					builder.equal(cuentaRoot.get("subGrupo"), subgrupo));
			return this.entityManager.createQuery(criteria).getSingleResult();
		} catch (Exception re) {
			return 0;
		}

	}

	public Cuenta buscarCuentaPorCodigo(String codigo) {
		CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
		CriteriaQuery<Cuenta> criteria = builder.createQuery(Cuenta.class);
		Root<Cuenta> cuentaRoot = criteria.from(Cuenta.class);
		criteria.select(cuentaRoot);
		criteria.where(builder.equal(cuentaRoot.get("codigo"), codigo));
		return this.entityManager.createQuery(criteria).getSingleResult();

	}
	
	public List<Cuenta> buscarCuentaPorEstado(Estado estado) {
		CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
		CriteriaQuery<Cuenta> criteria = builder.createQuery(Cuenta.class);
		Root<Cuenta> cuentaRoot = criteria.from(Cuenta.class);
		criteria.select(cuentaRoot);
		criteria.where(builder.equal(cuentaRoot.get("estado"), estado),builder.equal(cuentaRoot.get("subGrupo"), SubGrupo.CLIENTES));		
		return this.entityManager.createQuery(criteria).getResultList();

	}

}